var path = require('path')
var express = require('express')
var webpack = require('webpack')
var config = require('./config')
var utils = require('./utils')
utils.buildConfig(process.argv[2])
    // var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = process.env.NODE_ENV === 'testing' ? require('./webpack.dev') : require('./webpack.dev')

// default port where dev server listens for incoming traffic
var port = 8080
    // https://github.com/chimurai/http-proxy-middleware
var proxyTable = {}

var app = express()
var compiler = webpack(webpackConfig)

var devMiddleware = require('webpack-dev-middleware')(compiler, {
    publicPath: webpackConfig.output.publicPath,
    stats: {
        colors: true,
        chunks: false
    },
    watchOptions: {
        aggregateTimeout: 300,
        poll: true
    }
})

var hotMiddleware = require('webpack-hot-middleware')(compiler)
    // force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function(compilation) {
    compilation.plugin('html-webpack-plugin-after-emit', function(data, cb) {
        hotMiddleware.publish({
            action: 'reload'
        })
        cb()
    })
})

// proxy api requests
// Object.keys(proxyTable).forEach(function(context) {
//     var options = proxyTable[context]
//     if (typeof options === 'string') {
//             target: options
//         }
//     }
//     app.use(proxyMiddleware(context, options))
// })

// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())

// serve webpack bundle output
app.use(devMiddleware)

// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)

// serve pure static assets
var staticPath = path.posix.join(config.build.assetsPublicPath, config.build.assetsSubDirectory)
app.use(staticPath, express.static('./static'))

module.exports = app.listen(port, function(err) {
    if (err) {
        console.log(err)
        return
    }
    console.log('Listening at http://localhost:' + port + '\n')
})
